// config 是axios的配置信息

import axios from "axios";
import router from "../router";
import elementUl from 'element-ui'
import NProgress from 'nprogress' //引入进度条

// console.log(elementUl); //可以打印出elementul中的一些信息，在这些信息里面我们可以拿到所有的封装的方法
// console.log(axios.CancelToken);
let CancelToken = axios.CancelToken

let http = axios.create({
  //axios.create表示的是对axios的一些配置，//会把传入的对象当成ax ios的prototype
  baseURL: "/api",
  timeout: 10000, //如果超时就会进入reject
  withCredentials: true, //表示的是是否携带凭证进行数据交换
});
//axios请求拦截器
http.interceptors.request.use(function (config) {
  NProgress.start() //出现进度条
  //请求拦截器,axios拦截器 可以拦截所有的请求,在这个处理函数里面，我们可以对一些请求进行一些处理
  // console.log(config);
  // 由于 登入 获取验证码 校验验证码 不需要token，所以我们可以将他们放行
  let rowPaths = ["/users/getCaptcha", "/users/verifyCaptcha", "/users/login"];
  if (rowPaths.includes(config.url)) {
    //如果config.url中有我们在rowPaths中的元素,就放行
    return config; //return表示的是放行的意思，return后面的东西表示的是不被拦截
  } else {
    //如果config.url中没有我们定义的直接放行的地址
    let token = localStorage.getItem("qf-token") || "";
    // console.log(token);
    // console.log(123);
    config.headers["authorization"] = token; //表示添加请求头
    // authorization是后台给规定的
    return config;
  }
});
// axios响应拦截器
http.interceptors.response.use(function(config){
  NProgress.done() //进度条消失
  //当响应回来的状态码是10022 或者1004的时候需要跳转到登入页,清除token
  // console.log(config);//打印的结果下面的data中是被拦截的响应
  if(config.data.code==='10022'||config.data.code==='1004'){
    //1. 跳转路由到登录页
    router.push('/login') //因为这个文件不是vue组件所以不能直接使用router，所以需要引入router
    //2. 清除token
    localStorage.removeItem('qf-token')
    //3.提示登录过期
    elementUl.Message.error('登录过期，请重新登录')
    return
  }
  if(config.data.code==='10026'){
    elementUl.Message.error('没有权限')
    return
  }
  return config //放行
})
export {//表示的导出两个内容，一个是http,一个是中断请求的canceltoken
  http as default,//设置http为默认导出的方式
  CancelToken
}; //导出配置的文件
